package gestionYClasesDeNegocio;

import controladores.*;
import controladores.exceptions.IllegalOrphanException;
import controladores.exceptions.NonexistentEntityException;
import entity.ComentarioEntity;
import entity.ObjetoEntity;
import entity.UsuarioEntity;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class GestorPersistencia
{

    private static String emfName = "MegaArchivoAppPU";
    //Usuario

    public static Usuario verificarUsuario(String nom, String pass)
    {
        Usuario login=null;
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        UsuarioEntityJpaController usuCont = new UsuarioEntityJpaController(emf);
        UsuarioEntity a = usuCont.findUsuarioEntity(nom, pass);
        if (a != null)
        {
             login = new Usuario(usuCont.findUsuarioEntity(nom, pass));
        }
        else{
            login= null;
        }
            
        return login;

    }

    public static boolean guardarUsuario(Usuario usu)
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        UsuarioEntityJpaController usuCont = new UsuarioEntityJpaController(emf);
        usuCont.create(usu.getUsuarioEntity());
        emf.close();
        return true;
    }

    public static ArrayList<Objeto> buscarObjetos()
    {
        ArrayList<Objeto> vec = new ArrayList<Objeto>();
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        ObjetoEntityJpaController objCont = new ObjetoEntityJpaController(emf);
        List<ObjetoEntity> aux = objCont.buscarUltimosObjetos();
        for (ObjetoEntity o : aux)
        {
            Objeto obj = new Objeto(o);
            vec.add(obj);
        }
        return vec;
    }

    public static ArrayList<Objeto> buscarObjeto(String cod)
    {
        ArrayList<Objeto> vec = new ArrayList<Objeto>();
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        ObjetoEntityJpaController objCont = new ObjetoEntityJpaController(emf);
        List<ObjetoEntity> aux = objCont.buscarObjeto(cod);
        for (ObjetoEntity o : aux)
        {
            Objeto obj = new Objeto(o);
            vec.add(obj);
        }
        return vec;
    }

    public static Objeto buscarComentarios(int id)
    {

        Objeto objeto;
        ArrayList<Comentario> vec = new ArrayList<Comentario>();
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        ObjetoEntityJpaController objCont = new ObjetoEntityJpaController(emf);
        ComentarioEntityJpaController comCont = new ComentarioEntityJpaController(emf);
        ObjetoEntity obe = objCont.buscarObjeto(id);
        List<ComentarioEntity> aux = comCont.buscarComentarios(obe);
        for (ComentarioEntity o : aux)
        {
            Comentario com = new Comentario(o);
            vec.add(com);
        }
        objeto = new Objeto(obe);
        objeto.setArrCom(vec);
        return objeto;
    }

    public static boolean agregarComentario(Comentario c)
    {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        ComentarioEntityJpaController comCont = new ComentarioEntityJpaController(emf);
        comCont.create(c.getComEntity());
        return true;

    }

    public static ArrayList<Objeto> buscarMisObjeto(Usuario usu)
    {
        ArrayList<Objeto> vec = new ArrayList<Objeto>();
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        ObjetoEntityJpaController objCont = new ObjetoEntityJpaController(emf);
        List<ObjetoEntity> aux = objCont.buscarMisObjeto(usu.getUsuarioEntity());
        for (ObjetoEntity o : aux)
        {
            Objeto obj = new Objeto(o);
            vec.add(obj);
        }
        return vec;
    }

    public static boolean agregarObjeto(Objeto o)
    {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        ObjetoEntityJpaController objCont = new ObjetoEntityJpaController(emf);
        objCont.create(o.getObjetoEntity());
        return true;
    }

    public static boolean modificarUsuario(Usuario usu)
    {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        UsuarioEntityJpaController usuCont = new UsuarioEntityJpaController(emf);
        try
        {
            usuCont.edit(usu.getUsuarioEntity());
        } catch (Exception e)
        {
            System.out.println(e);
        }

        return true;

    }

    public static boolean modificarObjeto(Objeto obj)
    {
        boolean res = false;
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        ObjetoEntityJpaController objCont = new ObjetoEntityJpaController(emf);
        try
        {
            objCont.edit(obj.getObjetoEntity());
        } catch (Exception e)
        {
            System.out.println(e);
        }

        return true;

    }

////    public static Usuario cargarObjetosUsuario(int id) {
//        ArrayList<Comentario> colCom = new ArrayList();
//        ArrayList<Objeto> colObj = new ArrayList();
//        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
//        UsuarioEntityJpaController usuCont = new UsuarioEntityJpaController(emf);
//        UsuarioEntity usuD = usuCont.findUsuarioEntity(id);
//        emf.close();
//        List<ComentarioEntity> comEntyCol = (List<ComentarioEntity>) usuD.getComentarioEntityCollection();
//        List<ObjetoEntity> objEntyCol = (List<ObjetoEntity>) usuD.getObjetoEntityCollection();
//        Usuario usu = new Usuario(usuD.getNombreUsuario(), usuD.getPass(), usuD.getNombre(), usuD.getApellido(), usuD.getEmail());
//        for (int i = 0; i < comEntyCol.size(); i++) {
//            Comentario com = new Comentario(comEntyCol.get(i).getDescripcion());
//            com.setUsu(usu);
//            colCom.add(com);
//        }
//        for (int j = 0; j < objEntyCol.size(); j++) {
//            ObjetoEntity objEnty = objEntyCol.get(j);
//            Objeto obj = new Objeto(objEnty.getNombre(), objEnty.getDescripcion(), objEnty.getLink());
//            obj.setUsu(usu);
//            Tipo t = new Tipo(objEnty.getTipo().getNombre());
//            obj.setTipo(t);
//            colObj.add(obj);
//        }
//        usu.setArrCom(colCom);
//        usu.setArrObj(colObj);
//        return usu;
//    }
//    public static void modificarUsuario(Usuario usu) {
//        try {
//            EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
//            UsuarioEntityJpaController usuCont = new UsuarioEntityJpaController(emf);
//            usuCont.edit(usu.getUsuarioEntity());
//            emf.close();
//        } catch (IllegalOrphanException ex) {
//            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (NonexistentEntityException ex) {
//            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (Exception ex) {
//            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
//        }
//    }
    //Comentario
//    public static void guardarComentario(Comentario com) {
//        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
//        ComentarioEntityJpaController comCont = new ComentarioEntityJpaController(emf);
//        comCont.create(com.getComentarioEntity());
//        
//        emf.close();
//    }
//    public static Comentario cargarComentario(int id) {
//        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
//        ComentarioEntityJpaController comCont = new ComentarioEntityJpaController(emf);
//        Comentario comD = new Comentario(comCont.findComentarioEntity(id));
//        emf.close();
//        return comD;
//    }
//    public static void modificarComentario(Comentario com) {
//        try {
//            EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
//            ComentarioEntityJpaController comCont = new ComentarioEntityJpaController(emf);
//            comCont.edit(com.getComentarioEntity());
//            emf.close();
//        } catch (IllegalOrphanException ex) {
//            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (NonexistentEntityException ex) {
//            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (Exception ex) {
//            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
//        }
//    }
    //Objeto
    public static void guardarObjeto(Objeto obj)
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        ObjetoEntityJpaController objCont = new ObjetoEntityJpaController(emf);
        objCont.create(obj.getObjetoEntity());
        emf.close();
    }

    public static Objeto cargarObjeto(int id)
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        ObjetoEntityJpaController objCont = new ObjetoEntityJpaController(emf);
        Objeto objD = new Objeto(objCont.findObjetoEntity(id));
        emf.close();
        return objD;
    }

//    public static void modificarObjeto(Objeto obj) {
//        try {
//            EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
//            ObjetoEntityJpaController objCont = new ObjetoEntityJpaController(emf);
//            objCont.edit(obj.getObjetoEntity());
//            emf.close();
//        } catch (IllegalOrphanException ex) {
//            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (NonexistentEntityException ex) {
//            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (Exception ex) {
//            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
//        }
//    }
    //Tipo
    public static void guardarTipo(Tipo tip)
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        TipoEntityJpaController tipCont = new TipoEntityJpaController(emf);
        tipCont.create(tip.getTipoEntity());
        emf.close();
    }

    public static Tipo cargarTipo(int id)
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
        TipoEntityJpaController tipCont = new TipoEntityJpaController(emf);
        Tipo tipD = new Tipo(tipCont.findTipoEntity(id));
        emf.close();
        return tipD;
    }

    public static void modificarTipo(Tipo tip)
    {
        try
        {
            EntityManagerFactory emf = Persistence.createEntityManagerFactory(emfName);
            TipoEntityJpaController tipCont = new TipoEntityJpaController(emf);
            tipCont.edit(tip.getTipoEntity());
            emf.close();
        } catch (IllegalOrphanException ex)
        {
            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex)
        {
            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex)
        {
            Logger.getLogger(GestorPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
